package cn.stylefeng.guns.modular.gridsystem.service;

import cn.stylefeng.guns.core.pojo.page.PageResult;
import cn.stylefeng.guns.modular.gridsystem.entity.BizException;
import cn.stylefeng.guns.modular.gridsystem.model.param.BizExceptionParam;
import cn.stylefeng.guns.modular.gridsystem.model.result.BizExceptionResult;
import cn.stylefeng.guns.modular.gridsystem.model.result.DeviceExceptionInfoResult;
import cn.stylefeng.guns.modular.gridsystem.model.result.ExceptionCountDataResult;
import cn.stylefeng.guns.modular.gridsystem.model.result.ExceptionHandleDataResult;
import cn.stylefeng.guns.modular.gridsystem.mqtt.result.FaultHistory;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 故障表 服务类
 *
 * @author 乔李莱莱
 * @since 2023/10/17
 */
public interface BizExceptionService extends IService<BizException> {

    /**
     * 分页查询故障表
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<BizException> page(BizExceptionParam bizExceptionParam);

    /**
     * 查询所有故障表
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    List<BizException> list(BizExceptionParam bizExceptionParam);

    /**
     * 添加故障表
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void add(BizExceptionParam bizExceptionParam);

    /**
     * 删除故障表
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void delete(BizExceptionParam bizExceptionParam);

    /**
     * 编辑故障表
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void edit(BizExceptionParam bizExceptionParam);

    /**
     * 查看详情故障表
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    BizException detail(BizExceptionParam bizExceptionParam);

    /**
     * 修改状态（字典 0正常 1停用 2删除）
     *
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void changeStatus(BizExceptionParam bizExceptionParam);

    /**
     * 查询设备最新一条未处理故障
     * @param deviceId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    Map<String, Object> getNewfaultFile(Integer deviceId);

    /**
     * 查询设备未处理故障
     * @param deviceId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    Set<String> getNewfaultList(Integer deviceId);

    /**
     * 查询最新一条 根据时间倒叙
     *
     * @param bizExceptionParam
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    BizException oneByErrorNameAndToday(BizExceptionParam bizExceptionParam);

    /**
     * 新增故障返回id
     *
     * @param bizExceptionParam
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    int addAndReturnId(BizExceptionParam bizExceptionParam);

    /**
     * 分页查询故障表
     *
     * @param bizExceptionParam
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<BizExceptionResult> pageList(BizExceptionParam bizExceptionParam);

    /**
     * 获取处理状态的数量
     *
     * @param deviceId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    Map<String, Long> countStatus(Integer deviceId);

    /**
     * 当年月度故障数量
     *
     * @param deviceId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    Map<String, Object> getErrorCountByMonth(Integer deviceId);

    List<ExceptionCountDataResult> getErrorCountByMonthList(Integer deviceId);

    /**
     * 查询异常的具体信息
     *
     * @param page
     * @param startTime
     * @param endTime
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<FaultHistory> queryFaultHistory(Page page, String startTime, String endTime);

    /**
     * 根据异常获取异常信息
     *
     * @param stationId
     * @param deviceId
     * @param startTime
     * @param endTime
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    List<BizExceptionResult> getDeviceExceptionList(Integer stationId, Integer deviceId, String startTime, String endTime);

    /**
     * 获取站点中已处理未处理故障数量
     *
     * @param stationId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    ExceptionHandleDataResult getExceptionHandleInfo(Integer stationId);

    /**
     * 获取设备异常信息列表
     *
     * @param deviceId
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    PageResult<DeviceExceptionInfoResult> getDeviceExceptionInfoList(Integer deviceId);

    /**
     * 定时结束警告声发
     *
     * @param id
     * @author 乔李莱莱
     * @since 2023/10/17
     */
    void stopAndStart(Integer id);

    /**
     * 查询故障数量
     * @param deviceId
     * @author 乔李莱莱
     * @since 2023/10/17
     * @return
     */
    List<Map<String, Object>> getExceptionInfo(Integer deviceId);

    /**
     * 查询网关下的故障数量
     * @param deviceCode
     * @author 乔李莱莱
     * @since 2023/10/17
     * @return
     */
    Integer getGatewayExceptionStatus(String deviceCode);
}
